/**
 * Project Name:gjerp
 * File Name:DateUtils.java
 * Package Name:com.times.util
 * Date:2015年6月26日上午10:52:49
 * Copyright (c) 2015, times.com All Rights Reserved.
 *
 */

package com.times.util;
 
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Random;

import org.apache.log4j.Logger;


/**
 * ClassName: DateUtils <br/>
 * Function: 日期处理工具类
 *
 * @author 
 * @version 2015年6月26日 
 */
public class DateUtils {
    
    private static final Logger logger = Logger.getLogger(DateUtils.class);
    
    /**
     * @description: 返回标准格式日期
     *
     * @author 
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date toStandardDate(String date) {
        try {
            SimpleDateFormat standard = StandardDateFormatter.getInstance();
            return standard.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("illegal date string format, could not parse! the string is " + date);
        }
        return null;
    }
    
    /**
     * @description: 按标准日期格式格式化日期字符串
     *
     * @author 
     * @param date
     * @return
     */
    public static String toStandardDateString(Date date){
        SimpleDateFormat standard = StandardDateFormatter.getInstance();
        return standard.format(date);
    }

    static class StandardDateFormatter{
        
        private static SimpleDateFormat INSTANCE = null;
        
        public static SimpleDateFormat getInstance(){
            if(INSTANCE == null){
                INSTANCE = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }
            return INSTANCE;
        }
    }
    public static Date getNowDate() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String dateString = formatter.format(currentTime);
    	  ParsePosition pos = new ParsePosition(8);
    	  Date currentTime_2 = formatter.parse(dateString, pos);
    	  return currentTime_2;
    	 }


    	 
    	 public static Date getNowDateShort() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	  String dateString = formatter.format(currentTime);
    	  ParsePosition pos = new ParsePosition(8);
    	  Date currentTime_2 = formatter.parse(dateString, pos);
    	  return currentTime_2;
    	 }


    	 
    	 public static String getStringDate() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String dateString = formatter.format(currentTime);
    	  return dateString;
    	 }


    	 
    	 public static String getStringDateShort() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	  String dateString = formatter.format(currentTime);
    	  return dateString;
    	 }

/***
 * yyyyMMdd
 * @return
 */
    	 public static String getStringDateShort1() {
       	  Date currentTime = new Date();
       	  SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
       	  String dateString = formatter.format(currentTime);
       	  return dateString;
       	 }
    	 
    	 public static String getTimeShort() {
    	  SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
    	  Date currentTime = new Date();
    	  String dateString = formatter.format(currentTime);
    	  return dateString;
    	 }


    	 
    	 public static Date strToDateLong(String strDate) {
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  ParsePosition pos = new ParsePosition(0);
    	  Date strtodate = formatter.parse(strDate, pos);
    	  return strtodate;
    	 }


    	 
    	 public static String dateToStrLong(java.util.Date dateDate) {
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String dateString = formatter.format(dateDate);
    	  return dateString;
    	 }


    	 
    	 public static String dateToStr(java.util.Date dateDate) {
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	  String dateString = formatter.format(dateDate);
    	  return dateString;
    	 }


    	 
    	 public static Date strToDate(String strDate) {
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	  ParsePosition pos = new ParsePosition(0);
    	  Date strtodate = formatter.parse(strDate, pos);
    	  return strtodate;
    	 }


    	 
    	 public static Date getNow() {
    	  Date currentTime = new Date();
    	  return currentTime;
    	 }


    	 
    	 public static Date getLastDate(long day) {
    	  Date date = new Date();
    	  long date_3_hm = date.getTime() - 3600000 * 34 * day;
    	  Date date_3_hm_date = new Date(date_3_hm);
    	  return date_3_hm_date;
    	 }


    	 
    	 public static String getStringToday() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss");
    	  String dateString = formatter.format(currentTime);
    	  return dateString;
    	 }


    	 
    	 public static String getHour() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String dateString = formatter.format(currentTime);
    	  String hour;
    	  hour = dateString.substring(11, 13);
    	  return hour;
    	 }


    	 
    	 public static String getTime() {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String dateString = formatter.format(currentTime);
    	  String min;
    	  min = dateString.substring(14, 16);
    	  return min;
    	 }


    	 
    	 public static String getUserDate(String sformat) {
    	  Date currentTime = new Date();
    	  SimpleDateFormat formatter = new SimpleDateFormat(sformat);
    	  String dateString = formatter.format(currentTime);
    	  return dateString;
    	 }


    	 
    	 public static String getTwoHour(String st1, String st2) {
    	  String[] kk = null;
    	  String[] jj = null;
    	  kk = st1.split(":");
    	  jj = st2.split(":");
    	  if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0]))
    	   return "0";
    	  else {
    	   double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60;
    	   double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60;
    	   if ((y - u) > 0)
    	    return y - u + "";
    	   else
    	    return "0";
    	  }
    	 }


    	 
    	 public static String getTwoDay(String sj1, String sj2) {
    	  SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
    	  long day = 0;
    	  try {
    	   java.util.Date date = myFormatter.parse(sj1);
    	   java.util.Date mydate = myFormatter.parse(sj2);
    	   day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
    	  } catch (Exception e) {
    	   return "";
    	  }
    	  return day + "";
    	 }


    	 
    	 public static String getPreTime(String sj1, String jj) {
    	  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	  String mydate1 = "";
    	  try {
    	   Date date1 = format.parse(sj1);
    	   long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60;
    	   date1.setTime(Time * 1000);
    	   mydate1 = format.format(date1);
    	  } catch (Exception e) {
    	  }
    	  return mydate1;
    	 }


    	 
    	 public static String getNextDay(String nowdate, String delay) {
    	  try{
    	  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	  String mdate = "";
    	  Date d = strToDate(nowdate);
    	  long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60;
    	  d.setTime(myTime * 1000);
    	  mdate = format.format(d);
    	  return mdate;
    	  }catch(Exception e){
    	   return "";
    	  }
    	 }


    	 
    	 public static boolean isLeapYear(String ddate) {


    	 
    	  Date d = strToDate(ddate);
    	  GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
    	  gc.setTime(d);
    	  int year = gc.get(Calendar.YEAR);
    	  if ((year % 400) == 0)
    	   return true;
    	  else if ((year % 4) == 0) {
    	   if ((year % 100) == 0)
    	    return false;
    	   else
    	    return true;
    	  } else
    	   return false;
    	 }


    	 
    	 public static String getEDate(String str) {
    	  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    	  ParsePosition pos = new ParsePosition(0);
    	  Date strtodate = formatter.parse(str, pos);
    	  String j = strtodate.toString();
    	  String[] k = j.split(" ");
    	  return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
    	 }


    	 
    	 public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
    	  String str = dat.substring(0, 8);
    	  String month = dat.substring(5, 7);
    	  int mon = Integer.parseInt(month);
    	  if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) {
    	   str += "31";
    	  } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
    	   str += "30";
    	  } else {
    	   if (isLeapYear(dat)) {
    	    str += "29";
    	   } else {
    	    str += "28";
    	   }
    	  }
    	  return str;
    	 }


    	 
    	 public static boolean isSameWeekDates(Date date1, Date date2) {
    	  Calendar cal1 = Calendar.getInstance();
    	  Calendar cal2 = Calendar.getInstance();
    	  cal1.setTime(date1);
    	  cal2.setTime(date2);
    	  int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
    	  if (0 == subYear) {
    	   if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
    	    return true;
    	  } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
    	   // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
    	   if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
    	    return true;
    	  } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
    	   if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
    	    return true;
    	  }
    	  return false;
    	 }


    	 
    	 public static String getSeqWeek() {
    	  Calendar c = Calendar.getInstance(Locale.CHINA);
    	  String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
    	  if (week.length() == 1)
    	   week = "0" + week;
    	  String year = Integer.toString(c.get(Calendar.YEAR));
    	  return year + week;
    	 }


    	 
    	 public static String getWeek(String sdate, String num) {
    	  // 再转换为时间
    	  Date dd = DateUtils.strToDate(sdate);
    	  Calendar c = Calendar.getInstance();
    	  c.setTime(dd);
    	  if (num.equals("1")) // 返回星期一所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    	  else if (num.equals("2")) // 返回星期二所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
    	  else if (num.equals("3")) // 返回星期三所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
    	  else if (num.equals("4")) // 返回星期四所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
    	  else if (num.equals("5")) // 返回星期五所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
    	  else if (num.equals("6")) // 返回星期六所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
    	  else if (num.equals("0")) // 返回星期日所在的日期
    	   c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
    	  return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    	 }


    	 
    	 public static String getWeek(String sdate) {
    	  // 再转换为时间
    	  Date date = DateUtils.strToDate(sdate);
    	  Calendar c = Calendar.getInstance();
    	  c.setTime(date);
    	  // int hour=c.get(Calendar.DAY_OF_WEEK);
    	  // hour中存的就是星期几了，其范围 1~7
    	  // 1=星期日 7=星期六，其他类推
    	  return new SimpleDateFormat("EEEE").format(c.getTime());
    	 }
    	 public static String getWeekStr(String sdate){
    	  String str = "";
    	  str = DateUtils.getWeek(sdate);
    	  if("1".equals(str)){
    	   str = "星期日";
    	  }else if("2".equals(str)){
    	   str = "星期一";
    	  }else if("3".equals(str)){
    	   str = "星期二";
    	  }else if("4".equals(str)){
    	   str = "星期三";
    	  }else if("5".equals(str)){
    	   str = "星期四";
    	  }else if("6".equals(str)){
    	   str = "星期五";
    	  }else if("7".equals(str)){
    	   str = "星期六";
    	  }
    	  return str;
    	 }


    	 
    	 public static long getDays(String date1, String date2) {
    	  if (date1 == null || date1.equals(""))
    	   return 0;
    	  if (date2 == null || date2.equals(""))
    	   return 0;
    	  // 转换为标准时间
    	  SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
    	  java.util.Date date = null;
    	  java.util.Date mydate = null;
    	  try {
    	   date = myFormatter.parse(date1);
    	   mydate = myFormatter.parse(date2);
    	  } catch (Exception e) {
    	  }
    	  long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
    	  return day;
    	 }


    	 
    	 public static String getNowMonth(String sdate) {
    	  // 取该时间所在月的一号
    	  sdate = sdate.substring(0, 8) + "01";


    	  // 得到这个月的1号是星期几
    	  Date date = DateUtils.strToDate(sdate);
    	  Calendar c = Calendar.getInstance();
    	  c.setTime(date);
    	  int u = c.get(Calendar.DAY_OF_WEEK);
    	  String newday = DateUtils.getNextDay(sdate, (1 - u) + "");
    	  return newday;
    	 }


    	 


    	 public static String getNo(int k) {


    	  return getUserDate("yyyyMMddhhmmss") + getRandom(k);
    	 }


    	 
    	 public static String getRandom(int i) {
    	  Random jjj = new Random();
    	  // int suiJiShu = jjj.nextInt(9);
    	  if (i == 0)
    	   return "";
    	  String jj = "";
    	  for (int k = 0; k < i; k++) {
    	   jj = jj + jjj.nextInt(9);
    	  }
    	  return jj;
    	 }


    	 
    	 public static boolean RightDate(String date) {


    	  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	  ;
    	  if (date == null)
    	   return false;
    	  if (date.length() > 10) {
    	   sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    	  } else {
    	   sdf = new SimpleDateFormat("yyyy-MM-dd");
    	  }
    	  try {
    	   sdf.parse(date);
    	  } catch (ParseException pe) {
    	   return false;
    	  }
    	  return true;
    	 }
}

